package main

import "fmt"

// 结构体 -编译器优化
// 结构体的方法，和哪个类型绑定，决定是值拷贝还是地址拷贝的是 看方法和哪个类型绑定
// 但是，编译器会对struct的方法进行优化
func main() {
	testStruct001()
	fmt.Println("-------------------------")
	testStruct002()
}

func testStruct001() {
	//new出来的是指针类型
	var c *Circle = new(Circle)
	(*c).Radius = 2.0
	area01 := (*c).area()
	fmt.Println(area01) //12.56

	//编译器优化后 等价
	area02 := c.area()
	fmt.Println(area02) //12.56
}
func testStruct002() {
	//值类型
	var c Circle
	c.Radius = 2.0

	area02 := (&c).area02() //方法绑定的是指针类型，所以传递的是地址
	//等价area02 := c.area02() //编译器优化
	fmt.Println(area02)   //314
	fmt.Println(c.Radius) //10
}

func (c Circle) area() float64 {
	return c.Radius * c.Radius * 3.14
}

/*
*
此时传递的是地址
*/
func (c *Circle) area02() float64 {
	(*c).Radius = 10
	return (*c).Radius * (*c).Radius * 3.14
	//编译器优化后，等价 return 03uncle.Radius * 03uncle.Radius * 3.14
}

type Circle struct {
	Radius float64
}
